package game

import (
	"gamesdk/inter"
	"gamesdk/wanyu/server/api/gameapi/gameframe"
	"gamesdk/wanyu/server/engine/wplog"
	"gamesdk/wanyu/server/protogo/gameddz"
	"github.com/golang/protobuf/ptypes"
)
func (g *DdzGame) SendScene(inter.UserInetr) bool{
	return true
}
func (g *DdzGame) UserExit(inter.UserInetr) bool{
	return true
}
//玩家进入游戏，返回true表示允许玩家进入，否则表示拒绝进入，isNewPlayer为false表示暂时离开后马上又回来的玩家（未将该玩家从玩家列表中移除），如果isNewPlayer为false，OnPlayerSitDown的返回值无意义
func (g *DdzGame) OnActionUserSitDown(user inter.UserInetr, chairId int, config string) int{
	var ret = false
	if g.GameState != GameState_GAMING && g.r.GetPlayerCount() <= g.gameCfg.GameCfg.MaxPlayerCnt {
		ret = true
		if g.r.Experience() == true {
			g.playersData[chairId] = &playerData{beginMoney: 1000000, isContinue: true, call: false}
		} else {
			g.playersData[chairId] = &playerData{beginMoney: player.GetFinance().Balance, isContinue: true, call: false}
		}

	}
	if ret {
		var event gamebase.EnterRoomRsp
		event.SeatId = int32(player.GetInfo().Seat)
		event.SceneInfo, _ = ptypes.MarshalAny(g.getScene(false, player))
		g.r.SendPersonEvent(player, int32(gateway.EventType_enterRoom), &event)
	}
	return ret

}

//玩家离开，返回true表示允许玩家离开，否则表示不允许离开，如果返回true，无论游戏处于什么状态，上层都会将该玩家从玩家列表中移除
func (g *DdzGame) LeaveGame(user inter.UserInetr) bool {
	return true
}


//处理玩家游戏事件，player是玩家信息，eventType表示事件类型（每个游戏的eventType的枚举值均不相同，event表示具体的游戏事件）
//如果处理玩家业务事件失败请抛出一个error，上层做统一处理，例如玩家钱不够，没轮到玩家说话等业务级错误信息，抛panic时请构建好确切的error，否则上层没有做一一对应的处理
//返回值：events: 需要框架层发送的消息d
//		flag：游戏当前状态，如果上一次返回gaming状态下一次返回wait状态说明一局游戏已经结束，框架层撤销本局游戏设定的所有定时器
func (g *DdzGame) OnGameMessage(subCmd int32, buffer []byte, user inter.UserInetr) {

}



//room层在处理游戏结束时调用，获取game内需要删除的玩家切片，不支持game层自己发送删除玩家，room层统一处理
//如果game层不需要删除玩家，则返回 nil 即可
//输入：无
//返回值：game层需要删除玩家的切片
func (g *DdzGame) CloseTable()  {

}



//询问游戏是否可以就绪，是返回true，否则返回false
func (g *DdzGame) UserReady(inter.UserInetr) bool {
	return g.r.GetPlayerCount() == g.gameCfg.GameCfg.MinPlayerCnt
}

//游戏正式开始
func (g *DdzGame) GameStart(inter.UserInetr) bool {
	return true
}


//获取玩家在game层的最新信息，返回json串，返回值中必须包含玩家是否真的被控
func (g *DdzGame) GetPlayerData(player wanju_gameframe.Player) string {
	if g.isCtrl && !player.GetInfo().IsRobot {
		return "{\"isControl\":true}"
	}
	return "{\"isControl\":false}"
}




//清理游戏信息
func (g *DdzGame) ResetTable() {
	wplog.Debug(g.r.GetDLogPrefix() + " 清理游戏信息 --- resetGameInfo ")
	g.banker = nil
	g.prebanker = nil
	g.curOper = nil
	g.firstCall = nil
	g.firstOuter = nil
	//g.maxCallType = gameddz.CallBankerType_CALL_NO
	g.maxOutPlayer = nil
	g.maxOutCards = nil
	g.threeCards = nil
	g.gameMulti = 1
	g.superDouble = false
	g.round = 0
	g.isOutRocket = false
	g.isCtrl = false
	//清理玩家数据
	for k := range g.playersData {
		g.playersData[k].call = false
		g.playersData[k].robChoose = 0
		g.playersData[k].callChoose = 0
	}
	for i := 0; i < int(gameddz.MultiChangeInform_ALL); i++ {
		if i == int(gameddz.MultiChangeInform_INIT) {
			g.multiDetail[i] = &multiDetailInfo{[3]int{int(g.gameCfg.KindCfg.BaseMultiple), 1, 1}}
		} else {
			g.multiDetail[i] = &multiDetailInfo{[3]int{1, 1, 1}}
		}
	}
}

func (g *DdzGame) killGameTimer() {
	g.r.RemoveTimer(g.timerID)
}
func (g *DdzGame) allOthersCanNotRob(myseat int) bool {
	a := g.playersData[(myseat+1)%3].callChoose
	b := g.playersData[(myseat+2)%3].callChoose
	return a == -1 && b == -1
}

func (g *DdzGame) killGameTimerEx(id int) {
	g.r.RemoveTimer(id)
}






func (g *DdzGame) playerRspCount() int {
	res := 0
	if g.playersData[0].resp {
		res++
	}
	if g.playersData[1].resp {
		res++
	}
	if g.playersData[2].resp {
		res++
	}
	return res
}


//游戏开始
func (g *DdzGame) processGameStart() {

}

